package com.mall.dubbo.api;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mall.dubbo.mappers.PmsProductAttributeCategoryMapper;
import com.mall.dubbo.mappers.PmsProductAttributeMapper;
import com.mall.dubbo.mappers.PmsProductCategoryAttributeRelationMapper;
import com.tanhua.model.domain.PmsProductAttribute;
import com.tanhua.model.domain.PmsProductAttributeCategory;
import com.tanhua.model.domain.PmsProductCategoryAttributeRelation;
import com.tanhua.model.vo.ProductAttributeCategoryListWithAttrVo;
import com.tanhua.model.vo.ProductAttributeProductVo;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;
import java.util.stream.Collectors;

@DubboService
public class PmsProductAttributeApiImpl implements  PmsProductAttributeApi{

    @Autowired
    private PmsProductAttributeMapper pmsProductAttributeMapper;

    @Autowired
    private PmsProductAttributeCategoryMapper pmsProductAttributeCategoryMapper;

    @Autowired
    private PmsProductCategoryAttributeRelationMapper pmsProductCategoryAttributeRelationMapper;


    /**
     * 根据分类查询属性列表或参数列表
     */
    @Override
    public Page findTypeList(Integer cid, Integer type, Page<PmsProductAttribute> page) {
        LambdaQueryWrapper<PmsProductAttribute> lqw = new LambdaQueryWrapper<>();
        lqw.eq(cid != null,PmsProductAttribute::getProductAttributeCategoryId, cid)
                .eq(type != null,PmsProductAttribute::getType,type);
        return pmsProductAttributeMapper.selectPage(page,lqw);
    }

    @Override
    public PmsProductAttribute findById(Integer id) {
        return pmsProductAttributeMapper.selectById(id);
    }

    @Override
    public void updateById(PmsProductAttribute pmsProductAttribute) {
        //获取修改前的attributeCategoryId
        long id = pmsProductAttribute.getId();
        Long start_productAttributeCategoryId = this.findById((int) id).getProductAttributeCategoryId();
        //获取修改后的attributeCategoryId
        Long end_productAttributeCategoryId = pmsProductAttribute.getProductAttributeCategoryId();

        pmsProductAttributeMapper.updateById(pmsProductAttribute);

        this.updateProductAttributeCategoryCount(start_productAttributeCategoryId);
        //相等只用改一次,不相等改两次
        if (start_productAttributeCategoryId != end_productAttributeCategoryId){
            this.updateProductAttributeCategoryCount(end_productAttributeCategoryId);
        }
    }

    /**
     * 添加商品属性信息
     * @param pmsProductAttribute
     * @return
     */
    @Override
    public void save(PmsProductAttribute pmsProductAttribute) {
        pmsProductAttributeMapper.insert(pmsProductAttribute);
        this.updateProductAttributeCategoryCount(pmsProductAttribute.getProductAttributeCategoryId());
    }

    /**
     * 批量删除商品属性
     * @param ids
     * @return
     */
    @Override
    public void deleteByIds(Integer[] ids) {
        List<Integer> integers = Arrays.asList(ids);
        Long productAttributeCategoryId = this.findById(ids[0]).getProductAttributeCategoryId();
        pmsProductAttributeMapper.deleteBatchIds(integers);
        this.updateProductAttributeCategoryCount(productAttributeCategoryId);

    }



    /**
     * 根据ids查询到所有pmsProductAttribute
     */
    public List<PmsProductAttribute> findByIds(Integer[] ids){
        LambdaQueryWrapper<PmsProductAttribute> pmsProductAttributeLambdaQueryWrapper = new LambdaQueryWrapper<>();
        pmsProductAttributeLambdaQueryWrapper.in(ids != null,PmsProductAttribute::getId,ids);
        return pmsProductAttributeMapper.selectList(pmsProductAttributeLambdaQueryWrapper);
    }



    /**
     * 每次 删除 更新 修改 之后修改 pms_product_attribute_category 中 两个count的数量
     */
    public void updateProductAttributeCategoryCount(Long attributeCategoryId){
        PmsProductAttributeCategory pmsProductAttributeCategory = new PmsProductAttributeCategory();
        Integer attributeCountNum = pmsProductAttributeMapper.selectByIdAttributeCountNum(attributeCategoryId);
        Integer paramCountNum = pmsProductAttributeMapper.selectByIdParamCountNum(attributeCategoryId);
        pmsProductAttributeCategory.setId(attributeCategoryId);
        pmsProductAttributeCategory.setAttributeCount(attributeCountNum);
        pmsProductAttributeCategory.setParamCount(paramCountNum);
        pmsProductAttributeCategoryMapper.updateById(pmsProductAttributeCategory);
    }


    /**
     * 修改商品属性分类
     * @param id
     * @param name
     * @return
     */
    @Override
    public void categoryUpdate(Long id, String name) {
        PmsProductAttributeCategory pmsProductAttributeCategory = pmsProductAttributeCategoryMapper.selectById(id);
        pmsProductAttributeCategory.setName(name);
        pmsProductAttributeCategoryMapper.updateById(pmsProductAttributeCategory);
    }

    /**
     * 添加商品属性分类
     * @param name
     */
    @Override
    public void categorySave(String name) {
        PmsProductAttributeCategory pmsProductAttributeCategory = new PmsProductAttributeCategory();
        pmsProductAttributeCategory.setName(name);
        pmsProductAttributeCategoryMapper.insert(pmsProductAttributeCategory);
    }

    /**
     * 删除单个商品属性分类
     * @param id
     * @return
     */
    @Override
    public void categoryDelete(Long id) {
        pmsProductAttributeCategoryMapper.deleteById(id);
        LambdaQueryWrapper<PmsProductAttribute> lqw = new LambdaQueryWrapper<>();
        lqw.eq(id != null,PmsProductAttribute::getProductAttributeCategoryId,id);
        pmsProductAttributeMapper.delete(lqw);
    }


    /**
     * 获取所有商品属性分类及其下属性
     * @return
     */
    @Override
    public List<ProductAttributeCategoryListWithAttrVo> categoryListWithAttr() {
        //查到所有商品属性分类转换成vo对象
        List<PmsProductAttributeCategory> categories = pmsProductAttributeCategoryMapper.selectList(new LambdaQueryWrapper<PmsProductAttributeCategory>());
        List<ProductAttributeCategoryListWithAttrVo> categorieVoList = categories.stream().map(categorie -> {
            ProductAttributeCategoryListWithAttrVo categorieVo = new ProductAttributeCategoryListWithAttrVo();
            BeanUtils.copyProperties(categorie, categorieVo);
            return categorieVo;
        }).collect(Collectors.toList());

        //查到所有下级分类,转换成map对象
        Map<Long, List<PmsProductAttribute>> map = new HashMap<>();
        List<PmsProductAttribute> pmsProductAttributeList = pmsProductAttributeMapper.selectList(new LambdaQueryWrapper<PmsProductAttribute>());
        for (PmsProductAttribute pmsProductAttribute : pmsProductAttributeList) {
            Long categoryId = pmsProductAttribute.getProductAttributeCategoryId();
            if (map.get(categoryId) == null){
                ArrayList<PmsProductAttribute> pmsProductAttributes = new ArrayList<>();
                pmsProductAttributes.add(pmsProductAttribute);
                map.put(categoryId,pmsProductAttributes);
            }else {
                List<PmsProductAttribute> pmsProductAttributeList1 = map.get(categoryId);
                pmsProductAttributeList1.add(pmsProductAttribute);
            }
        }

        //封装返回对象
        for (ProductAttributeCategoryListWithAttrVo pvo : categorieVoList) {
            pvo.setProductAttributeList(map.get(pvo.getId()));
        }

        return categorieVoList;
    }

    /**
     * 根据productCategoryId,获得attributeCategoryId,attributeId
     * @param productCategoryId
     * @return
     */
    @Override
    public List<ProductAttributeProductVo> attrInfoProductCategoryId(Long productCategoryId) {



        LambdaQueryWrapper<PmsProductCategoryAttributeRelation> lqw = new LambdaQueryWrapper<>();
        lqw.eq(productCategoryId != null,PmsProductCategoryAttributeRelation::getProductCategoryId,productCategoryId);
        List<PmsProductCategoryAttributeRelation> ppcarList = pmsProductCategoryAttributeRelationMapper.selectList(lqw);


        ArrayList<ProductAttributeProductVo> resuletList = new ArrayList<>();

        if (ppcarList != null){
            for (PmsProductCategoryAttributeRelation ppcar : ppcarList) {
                Long productAttributeId = ppcar.getProductAttributeId();
                PmsProductAttribute pmsProductAttribute = pmsProductAttributeMapper.selectById(productAttributeId);
                if (pmsProductAttribute != null){
                    ProductAttributeProductVo productAttributeProductVo = new ProductAttributeProductVo();
                    productAttributeProductVo.setAttributeId(pmsProductAttribute.getId());
                    productAttributeProductVo.setAttributeCategoryId(pmsProductAttribute.getProductAttributeCategoryId());
                    resuletList.add(productAttributeProductVo);
                }
            }
        }
        return resuletList;
    }

}
